package br.com.locasis.funcionalidades;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.international.StatusMessage.Severity;
import org.jboss.seam.international.StatusMessages;

import br.com.locasis.entity.Perfil;
import br.com.locasis.entity.Usuario;
import br.com.locasis.utilitarios.UtilString;

@Name("cadastrarUsuario")
@Scope(ScopeType.CONVERSATION)
//@Restrict(value="#{identity.hasRole('"+PerfilUsuario.PERFIL_PETSHOP+"')}")
public class CadastrarUsuario {
	
	@In(create=true)
	private EntityManager entityManager;
	
	private Usuario usuarioEdicao;
	
	@In(required = false)
    Usuario usuarioLogado;
	
	@In(value = "statusMessages")
	protected StatusMessages messages;
	
	private List<Usuario> listaUsuarios;
	
	@Out(required=false)
	private Usuario usuarioSelecionado;
	
	private boolean selecionadoTodos;
	
	private List<SelectItem> listaPerfis;
	
	private String confirmacaoSenha;
	
	private String senhaAtual;
	
	private String novaSenha;
	
	private Integer idPerfilSelecionado;

	public boolean isSelecionadoTodos() {
		return selecionadoTodos;
	}

	public void setSelecionadoTodos(boolean selecionadoTodos) {
		this.selecionadoTodos = selecionadoTodos;
	}
	
	public void selecionaTodos(){
		for(Usuario a : getListaUsuarios()){
			if(isSelecionadoTodos()){
				a.setSelecionado(true);
			}else{
				a.setSelecionado(false);
			}
		}
	}

	public void onLoad(){
		setListaUsuarios(null);
		if(usuarioSelecionado != null){
			usuarioEdicao = usuarioSelecionado;
		}
	}
	
	public void onLoadList(){
		setUsuarioEdicao(null);
		usuarioSelecionado = null;
	}
	
	public void alterarSenha(){
		if(UtilString.md5(getSenhaAtual()).equals(usuarioLogado.getSenha())){
			if(getConfirmacaoSenha().equals(getNovaSenha())){		
				usuarioLogado.setSenha(UtilString.md5(getNovaSenha()));
				entityManager.merge(usuarioLogado);
				entityManager.flush();
				messages.add(Severity.INFO,"Senha alterada com sucesso.");
				setSenhaAtual(null);
				setNovaSenha(null);
				setConfirmacaoSenha(null);
			}else{
				messages.add(Severity.ERROR,"A nova senha e a confirmação devem ser iguais.");
			}
		}else{
			messages.add(Severity.ERROR,"Senha atual inválida.");
		}
	}

	public String salvar(){
		if(getUsuarioEdicao().getIdUsuario() == null){
			if(!getUsuarioEdicao().getSenha().equals(getConfirmacaoSenha())){
				messages.add(Severity.ERROR,"A senha e a confirmação devem ser iguais.");
				return null;
			}
			try{
				entityManager.createQuery("select u from Usuario u where UPPER(u.login) = UPPER(:login) and u.flgAtivo is true")
					.setParameter("login", getUsuarioEdicao().getLogin())
					.getSingleResult();
				messages.add(Severity.ERROR,"Já existe um usuário com esse login cadastrado. Favor, utilizar outro.");
				return null;
			}catch(NoResultException e){
				try{
					entityManager.createQuery("select u from Usuario u where UPPER(u.login) = UPPER(:login) and u.idUsuario <> :idUsuario and u.flgAtivo is true")
						.setParameter("login", getUsuarioEdicao().getLogin())
						.setParameter("idUsuario", getUsuarioEdicao().getIdUsuario())
						.getSingleResult();
					messages.add(Severity.ERROR,"Já existe um usuário com esse login cadastrado. Favor, utilizar outro.");
					return null;
				}catch(NoResultException e2){
					getUsuarioEdicao().setSenha(UtilString.md5(getConfirmacaoSenha()));
					getUsuarioEdicao().setFlgAtivo(true);
					getUsuarioEdicao().setFlgLogado(false);
					getUsuarioEdicao().setPerfil(entityManager.find(Perfil.class, getIdPerfilSelecionado()));
					entityManager.merge(getUsuarioEdicao());
					entityManager.flush();
					messages.add(Severity.INFO,"Usuário cadastrado com sucesso.");
					setUsuarioEdicao(null);
					setIdPerfilSelecionado(null);
					return "persisted";
				}
			}
		}else{
			try{
				entityManager.createQuery("select u from Usuario u where UPPER(u.login) = UPPER(:login) and u.idUsuario <> :idUsuario and u.flgAtivo is true")
					.setParameter("login", getUsuarioEdicao().getLogin())
					.setParameter("idUsuario", getUsuarioEdicao().getIdUsuario())
					.getSingleResult();
				messages.add(Severity.ERROR,"Já existe um usuário com esse login cadastrado. Favor, utilizar outro.");
				return null;
			}catch(NoResultException e2){
				getUsuarioEdicao().setFlgAtivo(true);
//				getUsuarioEdicao().setFlgLogado(false);
				getUsuarioEdicao().setPerfil(entityManager.find(Perfil.class, getIdPerfilSelecionado()));
				entityManager.merge(getUsuarioEdicao());
				entityManager.flush();
				messages.add(Severity.INFO,"Usuário editado com sucesso.");
				setUsuarioEdicao(null);
				setIdPerfilSelecionado(null);
				return "persisted";
			}
		}
	}
	
	public void forcarLogoff(Usuario usuario){
		usuario.setFlgLogado(false);
		entityManager.merge(usuario);
		entityManager.flush();
		messages.add("A sessão do usuário '"+usuario.getLogin()+"' foi finalizada com sucesso.");
	}
	
	public void reiniciarSenha(Usuario usuario){
		usuario.setSenha(UtilString.md5("12345678"));
		usuario.setDtaUltimoAcesso(null);
		entityManager.merge(usuario);
		entityManager.flush();
		messages.add("Senha reiniciada com sucesso. A senha padrão é 12345678");
	}
	
	public String cancelar(){
		setUsuarioEdicao(null);
		return "voltar";
	}
	
	public void excluir(){
		List<Usuario> listaRemocao = new ArrayList<Usuario>();
		for(Usuario a : getListaUsuarios()){
			if(a.isSelecionado()){
				a.setFlgAtivo(false);
				entityManager.merge(a);
				listaRemocao.add(a);
			}
		}
		getListaUsuarios().removeAll(listaRemocao);
		entityManager.flush();
		messages.add(Severity.INFO,"Usuário(s) excluído(s) com sucesso.");
	}
	
	public String novo(){
		return "novo";
	}
	
	public String editar(Usuario usuario){
		usuarioSelecionado = usuario;
		setIdPerfilSelecionado(usuario.getPerfil().getIdPerfil());
		return "editar";
	}

	public Usuario getUsuarioEdicao() {
		if (usuarioEdicao == null) {
			usuarioEdicao = new Usuario();
		}
		return usuarioEdicao;
	}

	public void setUsuarioEdicao(Usuario usuarioEdicao) {
		this.usuarioEdicao = usuarioEdicao;
	}

	public List<Usuario> getListaUsuarios() {
		if (listaUsuarios == null) {
			listaUsuarios = entityManager.createQuery("select u from Usuario u where u.flgAtivo is true").getResultList();
		}
		return listaUsuarios;
	}

	public void setListaUsuarios(List<Usuario> listaUsuarios) {
		this.listaUsuarios = listaUsuarios;
	}

	public String getConfirmacaoSenha() {
		return confirmacaoSenha;
	}

	public void setConfirmacaoSenha(String confirmacaoSenha) {
		this.confirmacaoSenha = confirmacaoSenha;
	}

	public List<SelectItem> getListaPerfis() {
		if (listaPerfis == null) {
			listaPerfis = new ArrayList<SelectItem>();
			listaPerfis.add(new SelectItem(null,"Selecione"));
			List<Perfil> lista = entityManager.createQuery("select p from Perfil p where p.flgAtivo is true").getResultList();
			for(Perfil p : lista){
				listaPerfis.add(new SelectItem(p.getIdPerfil(),p.getNome()));
			}
		}
		return listaPerfis;
	}

	public void setListaPerfis(List<SelectItem> listaPerfis) {
		this.listaPerfis = listaPerfis;
	}

	public Integer getIdPerfilSelecionado() {
		return idPerfilSelecionado;
	}

	public void setIdPerfilSelecionado(Integer idPerfilSelecionado) {
		this.idPerfilSelecionado = idPerfilSelecionado;
	}

	public String getSenhaAtual() {
		return senhaAtual;
	}

	public void setSenhaAtual(String senhaAtual) {
		this.senhaAtual = senhaAtual;
	}

	public String getNovaSenha() {
		return novaSenha;
	}

	public void setNovaSenha(String novaSenha) {
		this.novaSenha = novaSenha;
	}
}
